package vf2.so;


import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.ServerNotActiveException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;

import vf1.so.VF1_SO_IClienteRMI;


public class VF2_SO_ServidorRMI extends UnicastRemoteObject implements VF2_SO_IServidorRMI {
	private static final long serialVersionUID = 1L;
	private static HashMap<String,VF1_SO_IClienteRMI> clientesRemotos = new HashMap<String,VF1_SO_IClienteRMI>();
	public VF2_SO_ServidorRMI() throws java.rmi.RemoteException {
		super();
	}


	/** m�todos de acesso **/

	public static HashMap<String, VF1_SO_IClienteRMI> getClientesRemotos() {
		return clientesRemotos;
	}


	/** m�todos de conectividade **/

	public boolean iniciarServidorRMI()throws UnknownHostException, MalformedURLException, RemoteException {
		try {
			LocateRegistry.createRegistry(6660);
			Naming.rebind("//localhost:6660//BattleFieldTactics", new VF2_SO_ServidorRMI());
			return true;
		} catch (MalformedURLException ex) {
			//tratar
		} catch (RemoteException ex) {
			//tratar
		}
		return false;
	}

	public boolean finalizarServidorRMI() {
		try {
			Naming.unbind("//localhost:6660//BattleFieldTactics");
			String servs[] = Naming.list("//localhost:6660//BattleFieldTactics");
			for (int s = 0; s < servs.length; s++) {
				System.err.println(servs[s]);
			}
			return true;
		} catch (RemoteException ex) {
			//tratar
		} catch (NotBoundException ex) {
			//tratar
		} catch (MalformedURLException ex) {
			//tratar
		}
		return false;
	}

	public boolean conectarCliente(String endereco) throws NotBoundException, MalformedURLException, RemoteException {
		System.out.printf("%s\n", endereco);
		//endereco = "rmi://"+endereco+":6661/BattleFieldTactics";
		//System.out.printf("%s\n", endereco);
		VF1_SO_IClienteRMI cliente = (VF1_SO_IClienteRMI) Naming.lookup(String.format("//%s:6660//BattleFieldTacticsCliente",endereco));
		getClientesRemotos().put(endereco, cliente);
		//cliente.iniciarTelaEspera();
		System.out.printf("%s\n", endereco);
		System.out.printf("Funciona");
		return true;
	}


	//VF2_SO_BFTServidorRMI
	public void conectarJogador (String usuario) throws java.rmi.RemoteException, ServerNotActiveException{
		String endereco = "xxx";
		boolean conectou = false;
		System.out.printf("Funciona\n");  //Douglas - Teste
		System.out.printf("O usuario e %s\n", usuario); // Douglas - Teste
		//VF2_SO_BFTServidor servidor = VF2_SO_BFTServidor.getServidor();
		try {
			System.out.printf("%s\n\n",getClientHost());
			endereco = getClientHost();
		} catch (ServerNotActiveException e) {
			e.printStackTrace();
		}
		try {
			conectou = conectarCliente(endereco);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		} 
		if (conectou) {
			VF2_SO_BFTServidor servidor = VF2_SO_BFTServidor.getServidor();
			servidor.conectarJogador(usuario, endereco);
		}
	}

	public void desconectarJogador (String usuario) throws java.rmi.RemoteException{
		//VF2_SO_BFTServidor.desconectarJogador(usuario);
		getClientesRemotos().remove(usuario);
	}


	/** m�todos diversos **/

	//VF2_SO_TurnoRMI
	public void atacarPosicao(int posicao_x, int posicao_y) throws RemoteException {
		//VF2_RN_Turno.atacarPosicao(posicao_x, posicao_y);
		VF2_SO_BFTServidor servidor = VF2_SO_BFTServidor.getServidor();
		servidor.getEspera().getBatalha().getTurno().atacarPosicao(posicao_x, posicao_y);
	}
	public void moverPersonagem(int posicao_x, int posicao_y) throws RemoteException {
		//VF2_RN_Turno.moverPersonagem( Jogador.Personagem personagem, int posicao_x, int posicao_y )
		VF2_SO_BFTServidor servidor = VF2_SO_BFTServidor.getServidor();
		servidor.getEspera().getBatalha().getTurno().moverPersonagem( posicao_x, posicao_y);
	}

}
